package db

import (
	"context"
	"gorm.io/gorm"
)

// 上下文存储事务对象的key（避免与其他context值冲突）
const TxKey = "tx"

// GetDB 统一获取DB连接：优先使用事务对象，否则使用默认DB
// 参数：
//   - ctx：上下文（可能包含事务对象）
//   - defaultDB：默认数据库连接（Repo层的db字段）
//   - tx：可选参数，直接传入的事务对象（优先级高于上下文）
//
// 返回值：
//   - *gorm.DB：最终使用的DB连接（事务对象或默认DB）
func GetDB(ctx context.Context, defaultDB *gorm.DB, tx ...*gorm.DB) *gorm.DB {
	// 1. 优先使用直接传入的事务对象（如果有）
	if len(tx) > 0 && tx[0] != nil {
		return tx[0].WithContext(ctx)
	}

	// 2. 其次从上下文中获取事务对象
	if ctxTx, ok := ctx.Value(TxKey).(*gorm.DB); ok {
		return ctxTx.WithContext(ctx)
	}

	// 3. 最后使用默认DB连接
	return defaultDB.WithContext(ctx)
}
